/**
 * **************************************************************************
 *
 * @说明: 
 * @项目名称: talent-aio-examples-server
 *
 * @author: tanyaowu 
 * @创建时间: 2016年11月18日 上午9:13:15
 *
 * **************************************************************************
 */
package com.talent.proxy.mysql.client;

import java.nio.ByteBuffer;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.talent.aio.client.intf.ClientAioHandler;
import com.talent.aio.common.ChannelContext;
import com.talent.aio.common.GroupContext;
import com.talent.aio.common.exception.AioDecodeException;
import com.talent.proxy.mysql.common.MysqlExt;
import com.talent.proxy.mysql.common.MysqlExt.SessionStatus;
import com.talent.proxy.mysql.common.MysqlPacket;
import com.talent.proxy.mysql.common.MysqlReturn;
import com.talent.proxy.mysql.common.packets.s2c.HandshakePacket;
import com.talent.proxy.mysql.common.packets.s2c.ResultSetWithMetaPacket;
import com.talent.proxy.mysql.common.utils.DecodeUtils;

/**
 * 
 * @author tanyaowu 
 * @创建时间 2016年11月18日 上午9:13:15
 *
 * @操作列表
 *  编号	| 操作时间	| 操作人员	 | 操作说明
 *  (1) | 2016年11月18日 | tanyaowu | 新建类
 *
 */
public class MysqlClientAioHandler implements ClientAioHandler<MysqlExt, MysqlPacket, MysqlReturn>
{
	private static Logger log = LoggerFactory.getLogger(MysqlClientAioHandler.class);

	/**
	 * 
	 *
	 * @author: tanyaowu
	 * @创建时间:　2016年11月18日 上午9:13:15
	 * 
	 */
	public MysqlClientAioHandler()
	{
	}

	/**
	 * @param args
	 *
	 * @author: tanyaowu
	 * @创建时间:　2016年11月18日 上午9:13:15
	 * 
	 */
	public static void main(String[] args)
	{
	}

	/** 
	 * @see com.talent.aio.common.intf.AioHandler#handler(com.talent.aio.common.intf.Packet)
	 * 
	 * @param packet
	 * @return
	 * @throws Exception 
	 * @重写人: tanyaowu
	 * @重写时间: 2016年11月18日 上午9:37:44
	 * 
	 */
	@Override
	public MysqlReturn handler(MysqlPacket packet, ChannelContext<MysqlExt, MysqlPacket, MysqlReturn> channelContext) throws Exception
	{
		return packet.onReceived(channelContext);
	}

	/** 
	 * @see com.talent.aio.common.intf.AioHandler#encode(com.talent.aio.common.intf.Packet)
	 * 
	 * @param packet
	 * @return
	 * @重写人: tanyaowu
	 * @重写时间: 2016年11月18日 上午9:37:44
	 * 
	 */
	@Override
	public ByteBuffer encode(MysqlPacket packet, GroupContext<MysqlExt, MysqlPacket, MysqlReturn> groupContext, ChannelContext<MysqlExt, MysqlPacket, MysqlReturn> channelContext)
	{
		return packet.encode(channelContext);
	}

	/** 
	 * @see com.talent.aio.common.intf.AioHandler#decode(java.nio.ByteBuffer)
	 * 
	 * @param buffer
	 * @return
	 * @throws AioDecodeException
	 * @重写人: tanyaowu
	 * @重写时间: 2016年11月18日 上午9:37:44
	 * 
	 */
	@Override
	public MysqlPacket decode(ByteBuffer buffer, ChannelContext<MysqlExt, MysqlPacket, MysqlReturn> channelContext) throws AioDecodeException
	{
		//		int initPosition = buffer.position();
		//		int readableLength = buffer.limit() - buffer.position();
		//		if (readableLength < MysqlPacket.HEADER_SIZE)
		//		{
		//			return null;
		//		}
		//
		//		int bodySize = BufferUtil.readUB3(buffer);
		//		if (readableLength < (MysqlPacket.HEADER_SIZE + bodySize))
		//		{
		//			return null;
		//		}
		//
		//		byte packetId = BufferUtil.read(buffer);
		//		
		//		
		//		
		//
		//		buffer.position(initPosition);

		MysqlExt mysqlExt = channelContext.getSessionContext();
		SessionStatus sessionStatus = mysqlExt.getSessionStatus();
		MysqlPacket mysqlPacket = null;
		switch (sessionStatus)
		{
		case CLIENT_WAITING_RESULTSET:
		{
			mysqlPacket = new ResultSetWithMetaPacket();
			try
			{
				mysqlPacket = mysqlPacket.decode(buffer, channelContext);
			} catch (Exception e)
			{
				throw new AioDecodeException(e);
			}
			break;
		}
		case CLIENT_WAITING_HANDSHAKE:
		{
			mysqlPacket = new HandshakePacket();
			try
			{
				mysqlPacket = mysqlPacket.decode(buffer, channelContext);
			} catch (Exception e)
			{
				throw new AioDecodeException(e);
			}
			break;
		}
		case CLIENT_WAITING_AUTH_RESP:
		{
			mysqlPacket = DecodeUtils.dispatchDecode(buffer, channelContext, true);
			break;
		}
		default:
		{
			log.error("不知道的会话状态:{}", sessionStatus);
			return null;
		}
		}

		return mysqlPacket;
	}

	/** 
	 * @see com.talent.aio.client.intf.ClientAioHandler#heartbeatPacket()
	 * 
	 * @return
	 * @重写人: tanyaowu
	 * @重写时间: 2016年12月6日 下午2:18:16
	 * 
	 */
	@Override
	public MysqlPacket heartbeatPacket()
	{
		return null;
	}

}
